# pragma once 
#include "google/protobuf/service.h"
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
#include <string>
#include <functional>
#include <google/protobuf/descriptor.h>
#include <unordered_map> 

// 框架提供的专门服务发布rpc的网络对象类
class RpcProvider
{
public:
    // 框架提供的为发布rpc服务的函数接口
    void NotifyService(google::protobuf::Service* service);

    // 启动rpc服务节点 开始提供rpc远程网络调用服务 
    void Run();

private:
    // 组合了EventLoop
    muduo::net::EventLoop m_eventLoop;

    // service存储服务类型信息 
    struct ServiceInfo
    {
        google::protobuf::Service* m_service; // 服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*>  m_methodMap;  // 服务方法 
    };
    // 存储服务注册成功的 服务对象 和 服务存储方法 的所有信息 
    std::unordered_map<std::string, ServiceInfo> m_serviceMap; 

    // 连接回调
    void OnConnection(const muduo::net::TcpConnectionPtr&);
    // 读写回调
    void OnMessage(const muduo::net::TcpConnectionPtr&, muduo::net::Buffer*, muduo::Timestamp);
    // Closure的回调操作 用于rpc序列化和网络发送 
    void SendRpcResponse(const muduo::net::TcpConnectionPtr&, google::protobuf::Message*);
};